<?php
/*
 * Quark PHP Framework
 * Copyright 2011, Sahib Alejandro Jaramillo Leo.
 * http://quarkphp.com/
 * Licensed under the GNU General Public License (http://www.gnu.org/licenses/gpl.html).
 */
/**
 * Definicion de clase abstracta HtmlElementsHandler
 * @filesource
 */
/**
 * Clase abstracta para incluir elementos HTMl en el documento
 * @author sahib
 */
abstract class HtmlElementsHandler {

	/**
	 * Elementos a incluir
	 * @access protected
	 * @var array
	 */
	protected $resources;

	/**
	 * Constructor
	 * @access public
	 * @return HtmlElementsHandler
	 */
	public function __construct( ) {

		$this->resources = array();
	}

	/**
	 * Agrega uno o mos elementos al final de lista de resources a incluir.
	 * @access public
	 * @param string|array $args,... elementos a agregar
	 * @return HtmlElementsHandler $this para hacer linking
	 */
	public function append( ) {

		$args = func_get_args( );
		foreach( $args as $resources )
			if( array_search( $resources, $this->resources ) === FALSE )
				$this->resources[] = $resources;
		return $this;
	}

	/**
	 * Agrega uno o mos elementos al inicio de la lista de resources a incluir.
	 * @access public
	 * @param string|array $args,... elementos a agregar
	 * @return HtmlElementsHandler $this para hacer linking
	 */
	public function prepend( ) {

		$args = func_get_args( );
		foreach( array_reverse( $args ) as $resources )
			if( array_search( $resources, $this->resources ) === FALSE )
				array_unshift( $this->resources, $resources );
		return $this;
	}

	/**
	 * Metodo magico para imprimir directamente el objeto
	 * @access public
	 * @return string codigo HTML de todos los elementos agregados.
	 */
	public function __toString( ) {

		$html = '';
		foreach( $this->resources as $resource )
			$html .= $this->write( $resource, TRUE );
		return $html;
	}

	/**
	 * Escribe el codigo HTML necesario para incluir el elemento $resource
	 * Si $return es TRUE, devuelve una cadena con el codigo HTML en lugar de imprimirlo
	 * 
	 * @access public
	 * @param mixed $resource elemento a imprimir
	 * @param bool $return si es TRUE, se devuelve el codigo HTML del resource
	 * @return string codigo HTML del resource
	 */
	abstract public function write( $resource, $return = FALSE );
}
?>